#include "chart.h"
#include <QtWidgets/QGesture>
#include <QtWidgets/QGraphicsScene>
#include <QtWidgets/QGraphicsView>

/*
    ChartTypeCartesian是其中的一种类型，它基于笛卡尔坐标系，可以用于显示二维数据。
    笛卡尔坐标系是平面上常用的坐标系，由横轴（x轴）和纵轴（y轴）组成。通过在二维平面上绘制点、线或其他图形，可以将数据可视化为图表。
*/
Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags)
    : QChart(QChart::ChartTypeCartesian, parent, wFlags)
{
    /*
        grabGesture函数来注册手势事件。具体来说，它注册了平移手势（Qt::PanGesture）和缩放手势（Qt::PinchGesture）。
        注册手势事件是为了在应用程序中捕获和处理用户的手势输入。通过注册手势，你可以响应用户在触摸屏上进行的平移和缩放操作。
        平移手势通常用于在界面上平移视图或对象。当用户在触摸屏上滑动手指时，会触发平移手势事件，你可以通过处理该事件来实现相应的平移操作。
        缩放手势通常用于在界面上进行缩放操作，例如放大或缩小图像或内容。当用户在触摸屏上进行捏合手势时，会触发缩放手势事件，你可以通过处理该事件来实现相应的缩放操作。
    */
    grabGesture(Qt::PanGesture);    // 平移手势
    grabGesture(Qt::PinchGesture);
}

Chart::~Chart()
{

}

//![场景事件:它首先判断事件的类型是否为手势事件（QEvent::Gesture），如果是，则调用gestureEvent函数进行手势事件的处理；
//! 如果不是手势事件，则将事件交给QChart::event函数进行默认的事件处理。]
bool Chart::sceneEvent(QEvent *event)
{
    if (event->type() == QEvent::Gesture)
        return gestureEvent(static_cast<QGestureEvent *>(event));
    return QChart::event(event);
}

bool Chart::gestureEvent(QGestureEvent *event)
{
    if (QGesture *gesture = event->gesture(Qt::PanGesture)) {
        QPanGesture *pan = static_cast<QPanGesture *>(gesture);
        QChart::scroll(-(pan->delta().x()), pan->delta().y()); // 传入的参数是偏移量的负值，用于反向滚动图表。
    }

    /*
        并检查缩放因子是否发生变化（pinch->changeFlags() & QPinchGesture::ScaleFactorChanged）。
        如果缩放因子发生变化，调用QChart::zoom函数实现相应的缩放操作，传入的参数是缩放因子（pinch->scaleFactor()）。
    */
    if (QGesture *gesture = event->gesture(Qt::PinchGesture)) {
        QPinchGesture *pinch = static_cast<QPinchGesture *>(gesture);
        if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged)
            QChart::zoom(pinch->scaleFactor());
    }

    return true; // 函数返回true，表示手势事件已经被处理。
}
//![end]
